#!/bin/sh

# This command updates the spamassassin configuration; tests the new
# configuration; then moves the updated configuration in place

set -e

SVN=$(which svn)

TMPDIR=$(mktemp -d);

HOSTNAME=$(hostname);

if [ "$HOSTNAME" = "buxtehude" ]; then
    BASEDIR="/org/bugs.debian.org"
    USERCONF="bugs/user_prefs";
elif [ "$HOSTNAME" = "bendel" ]; then
    BASEDIR="/var/list/.etc";
    USERCONF="lists/user_prefs";
else
    echo "Unknown hostname '$HOSTNAME'";
    exit 1;
fi;

SACONFIG="$BASEDIR/spamassassin_config";
BAKDIR="$BASEDIR/spamassassin_config_bak";

# because alioth continuously fails, make sure that svn info will
# succeed first before cluttering the log. Ideally we would report
# this error, but it happens far too frequently, so we bail out here.
if ! svn info $(svn info $SACONFIG|awk '/^URL:/{print $2}') >/dev/null 2>&1; then
    exit 0;
fi;

# figure out if there's an update to be made
ORIGREV=$(svn info $SACONFIG |awk '/^Revision:/{print $2}')
NEWREV=$(svn info $(svn info $SACONFIG|awk '/^URL:/{print $2}')|awk '/^Revision:/{print $2}')

# no changes, bug out.
if [ "0$ORIGREV" -ge "0$NEWREV" ]; then
    exit 0;
fi;

if [ -e "$SACONFIG/.update_spamassassin" ] && kill -0 $(cat "$SACONFIG/.update_spamassassin") >/dev/null 2>&1; then
    echo "Another update_spamassassin appears to be running"
    exit 1;
else
    echo $$ > "$SACONFIG/.update_spamassassin";
fi;

remove_pidfile () {
    rm "$SACONFIG/.update_spamassassin";
}

trap remove_pidfile 0;

FAILUREMESSAGE="";
report_failure () {
    # Hrm; a previous update failed; don't report again until the file
    # is removed or it's more than a day old
    if [ -e "$SACONFIG/failed_update" ] &&
	[ $(($(date +%s) - $(stat -c '%Y' "$SACONFIG/failed_update"))) -lt 86400 ];  then
	rm -rf "$TMPDIR"
	exit 0;
    fi;
    echo "$FAILUREMESSAGE" > "$SACONFIG/failed_update"
    echo "$FAILUREMESSAGE";
    cat - <<EOF;

update_spamassassin will only report this error once a day, and
updates will not occur until this is fixed.

Please fix the problem and then remove
$SACONFIG/failed_update
EOF
    rm -rf "$TMPDIR"
    exit 1;
}

cp -ar $SACONFIG $TMPDIR/.
OLDDIR="$(pwd)"
cd $TMPDIR/spamassassin_config;
svn update -q --non-interactive; 
if svn status |grep -q '^C'; then
    FAILUREMESSAGE=$'The following conflicts were found\n\n'
    FAILUREMESSAGE="$FAILUREMESSAGE$(svn status|grep ^C)";
    report_failure
fi;
cd "$(pwd)"

if ! spamassassin -p $TMPDIR/spamassassin_config/$USERCONF --lint > $TMPDIR/sa_lint 2>&1; then
    FAILUREMESSAGE="$(echo -e 'spamassassin -p $TMPDIR/spamassassin_config/$USERCONF --lint\nfailed with\n'| cat - $TMPDIR/sa_lint)";
    report_failure
fi;
mv "$SACONFIG" "$BAKDIR/spamassassin_config_r$ORIGREV"
mv "$TMPDIR/spamassassin_config" "$SACONFIG"
trap - 0
remove_pidfile
rm -rf "$TMPDIR"

if [ "$HOSTNAME" = "buxtehude" ]; then
    touch /home/debbugs/.spamassassin/user_prefs
elif [ "$HOSTNAME" = "bendel" ]; then
    # do nothing
    true;
else
    echo "Unknown hostname '$HOSTNAME'";
    exit 1;
fi;


exit 0;
